TFDMemTable数据批量处理问题

daigua1987 2024-04-14 17:15:38

由于我界面上的Grid都是绑定的TFDMemTable,需要批量处理的时候,如果是直接用绑定TFDMemTable去循环处理,处理速度会很慢,如果我把数据复制到另外一个TFDMemTable里面再处理速度就很快,但是我用TFDMemTable.data把数据复制过去的时候,更新记录的信息没复制过去,造成我用ApplyUpdates去更新数据库的时候,更新不到信息。下面是代码

procedure TFPOrder.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  FDMemTable: TFDMemTable;
begin
  if Key = 13 then
  begin
    FDMemTable := TFDMemTable.Create(nil);
    FDMemTable.Data := DetailData.Data;
    FDMemTable.First;
    while not FDMemTable.Eof do
    begin
      FDMemTable.Edit;
      FDMemTable.FieldByName('TaxPrice').AsFloat :=
        RoundFloat(FDMemTable.FieldByName('Price').AsFloat *
        (1 + (StrToFloat(Edit2.Text) / 100)), 2);

      if FDMemTable.FieldByName('TaxAmount').AsFloat > 0 then
        FDMemTable.FieldByName('TaxAmount').AsFloat :=
          RoundFloat(FDMemTable.FieldByName('Price').AsFloat *
          (1 + (StrToFloat(Edit2.Text) / 100)) * FDMemTable.FieldByName('Qty')
          .AsFloat, 2);

      FDMemTable.Post;
      FDMemTable.Next;
    end;
    DetailData.Close;
    DetailData.Data := FDMemTable.Data;
    DetailData.Open;
    FDMemTable.Free;
  end;
end;

有什么办法,可以快速批量更新数据,还能把更新的信息传递到数据库?

...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueStorm 04-15
  • 打赏
  • 举报
回复

//不需要搞得那么复杂,使用DetailData的EnableControls/ DisableControls就可以了,
//数据更新期间, Grid的显示是不更新的.

procedure TFPOrder.Edit2KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key <> 13 then Exit;
  With DetailData do
  begin
    DisableControls;
    First;
    while not Eof do
    begin
      Edit;
      FieldByName('TaxPrice').AsFloat :=
        FieldByName('Price').AsFloat * (1 + (StrToFloat(Edit2.Text) / 100));

      if FieldByName('TaxAmount').AsFloat > 0 then
        FieldByName('TaxAmount').AsFloat :=
          FieldByName('Price').AsFloat * (1 + (StrToFloat(Edit2.Text) / 100)) * FieldByName('Qty').AsFloat;

      Post;
      Next;
    end;
    EnableControls;
  end;
end;

daigua1987 04-16
  • 举报
回复
@BlueStorm 这个办法试过,界面上还是会滚动数据,这样处理就慢了,本身循环不慢,就是前台界面数据下移造成处理速度慢了
BlueStorm 04-16
  • 举报
回复
@daigua1987 使用了Disablecontrols, 界面上就**绝对**不可能还有数据滚动, 只有在最后EnableControls, 界面才会把最终的修改结果一次性显示出来. 如果你的程序界面还有数据滚动, 你要看一下你的程序哪里没写对.
BlueStorm 04-16
  • 举报
回复
@daigua1987 修改数据前DisableControls, 修改完**全部**数据后, 才EnableControls, 而不是每修改一行,都做一次DisableControls/EnableControls处理. 如果你认为我的说法不正确,请提供一个演示程序,证明你的说法是正确的.
2条回复
daigua1987 04-15
  • 打赏
  • 举报
回复

FDMemTable 创建的时候忘记加东西了FDMemTable.CachedUpdates:=True; 这个忘记加了 导致更新的信息没有

tanqth 04-15
  • 举报
回复
@daigua1987 自己解决了哇。
daigua1987 04-15
  • 举报
回复
@tanqth 给GTP误导了,说复制数据,无法复制更新的日志信息
tanqth 04-15
  • 举报
回复
@daigua1987 实践出真理

5,390

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧